<?php
/**
 * @author Kelvin **/
 /**
  * Mô tả các hoạt động của notification
  * - Khi có comment mới của 1 người - check xem article ấy có đang được theo dõi ko, nếu đang theo dõi thì 
  *     insert vào bảng noti comment
  * - Khi comment 1 article - Thêm theo dõi article ấy vào bảng user_article
  * - Khi có trả lời 1 comment thì ko insert vào bảng noti comment của những người theo dõi article mà
  *     chỉ insert vào bảng noti reply
  * - Khi 1 editor đăng bài viết trong admin thì user theo dõi editor ấy sẽ nhận được thông báo đăng bài mới
  * */
//Bảng user_follow là bảng lưu mối quan hệ user - follow user
//usf_user_id : ID của user được xét
//usf_follow_id : ID của user được follow
//Như vậy nếu muốn gửi thông báo cho các user đang follow mình thì cần lấy ra danh sách các usf_user_id để 
//gửi thông báo
//Danh sách các user đang follow mình thì sẽ lấy từ thuộc tính use_profile->getListFollowMe()
class Notification{
    //Bảng CSDL lưu các thông báo
    //Các trường có hậu tố article_type trong 3 bảng notification có các giá trị sau
    /* 
    Ứng với article là Tin tức thì lưu type là 0;
                       Đánh giá        type    1;
                       UserReview      type    2;
    */
    
    //Các trường có hậu tố status trong 3 bảng notification lưu tình trạng của thông báo là đã đọc hay chưa
    var $table_nof = 'notifications_follow';
    /*
    Bảng notifications_follow có các chú ý sau
    nof_user_id : ID của user có thông báo
    nof_follow_id : ID của user đc follow (tác nhân tạo ra thông báo)
    nof_article_id : ID của bài viết - Insert được thực hiện khi user đăng bài, vì thế ID này là ID trả về của
    bài viết khi bài viết đó được đăng
    Thông báo trong bảng follow này không bao gồm các thông báo về việc user đăng comment mà chỉ đăng thông báo
    khi user đó đánh giá sản phẩm hoặc đăng bài tin tức (review)
    lưu ý lần nữa là tin tức và review chỉ được đăng bởi các user là mod 
    */
    
    var $table_nor = 'notifications_reply';
    
    /*
    Bảng notifications_comment có các chú ý sau
    noc_user_id - ID của user nhận đc thông báo
    noc_comment_by_user - ID của user đang comment ($this->use_id)
    noc_article_id - ID bài viết
    noc_article_type - loại bài viết 0 - Tin tức        1- Review
    noc_com_id - ID comment
    */
    var $table_noc = 'notifications_comment';
    var $use_id; //ID của user
    var $use_profile;
    public function __construct($use_id){
        if($use_id){
            $this->use_profile = new Profile($use_id);
            $this->use_id = $use_id;
        }
    }
    /**
     * @param $nof_article_type : 0 - Tin tuc       1 - Review      2 - UserReview
     * */
    
    public function InsertNotificationsFollow($nof_article_id,$nof_article_type){
        $array_follow_me = $this->use_profile->getListFollowMe();
        $time_insert = time();
        //Insert thông báo cho các user đã follow 
        foreach($array_follow_me as $follow_me){
            $db = new db_execute('INSERT INTO notification_follow(nof_user_id,
                                                                    nof_follow_id,
                                                                    nof_article_id,
                                                                    nof_article_type,
                                                                    nof_time) 
                                  VALUES(
                                    '.$follow_me.',
                                    '.$this->use_id.',
                                    '.$nof_article_id.',
                                    '.$nof_article_type.',
                                    '.$time_insert.'
                                  )');
            if($db->total != -1){
                unset($db);
            }
        }
        
    }
    
    /**
     * @param   nor_com_id - id của comment vừa được insert       
     *          nor_com_reply - id của comment được reply
     *          nor_user_id - id của user có comment được trả lời
     *          nor_article_id - id bài viết
     *          nor_article_type - 0 : tin tức     1 : review      2 : user review
     * */
    public function InsertNotificationsReply($nor_user_id, $nor_article_id, $nor_article_type, $nor_com_id, $nor_com_reply){
        //Insert thông báo
        if($nor_user_id == $this->use_id) return false;
        $db = new db_execute('INSERT INTO notification_reply(
                                            nor_user_id,
                                            nor_reply_by_user,
                                            nor_article_id,
                                            nor_article_type,
                                            nor_com_id,
                                            nor_com_reply,
                                            nor_time
                                ) VALUES(
                                            '.$nor_user_id.',
                                            '.$this->use_id.',
                                            '.$nor_article_id.',
                                            '.$nor_article_type.',
                                            '.$nor_com_id.',
                                            '.$nor_com_reply.',
                                            '.time().'
                                )') ;
       
        if($db->total != -1){
            unset($db);
            return true;
        }
    }
    /**
     * @param   noc_user_id - id của user nhận đc comment       
     *          noc_comment_by_user - id của user comment
     *          noc_user_id - id của user có comment được trả lời
     *          noc_article_id - id bài viết
     *          noc_article_type - 0 : tin tức     1 : review      2 : user review
     * */
    public function InsertNotificationsComment($noc_user_id, $noc_article_id, $noc_article_type, $noc_com_id){
        //Insert thông báo
        if($noc_user_id == $this->use_id) return false;
        $db = new db_execute('INSERT INTO notification_comment(
                                            noc_user_id,
                                            noc_comment_by_user,
                                            noc_article_id,
                                            noc_article_type,
                                            noc_com_id,
                                            noc_time
                                ) VALUES(
                                            '.$noc_user_id.',
                                            '.$this->use_id.',
                                            '.$noc_article_id.',
                                            '.$noc_article_type.',
                                            '.$noc_com_id.',
                                            '.time().'
                                )') ;
        if($db->total != -1){
            unset($db);
            return true;
        }
    }
    
    public function ListNotifications($sort_by_time = 0, $status = '',$limit = 0){
        $array_return = array();
        $where1 = '';
        $where2 = '';
        $where3 = '';
        if($sort_by_time){
            //Trả về mảng các notifications theo thứ tự thời gian
            
            if($status === 1){
                $where1 = ' AND nof_status = 1';
                $where2 = ' AND nor_status = 1';
                $where3 = ' AND noc_status = 1';
            }
            if($status === 0){
                $where1 = ' AND nof_status = 0';
                $where2 = ' AND nor_status = 0';
                $where3 = ' AND noc_status = 0';
            }
            //Mảng noti_follow
            $db = new db_query('SELECT nof_id,nof_user_id,
                                        nof_follow_id,
                                        nof_article_id,
                                        nof_article_type,
                                        nof_time AS sorting,
                                        nof_status
                                FROM notification_follow 
                                WHERE nof_user_id = '.$this->use_id .$where1);
            $array1 = $db->resultArray();unset($db);
            //Mảng noti_reply
            $db = new db_query('SELECT nor_id,nor_user_id,
                                        nor_reply_by_user,
                                        nor_article_id,
                                        nor_article_type,
                                        nor_com_id,
                                        nor_com_reply,
                                        nor_time AS sorting,
                                        nor_status
                                FROM notification_reply 
                                WHERE nor_user_id = '.$this->use_id . $where2);
            $array2 = $db->resultArray();unset($db);
            //Mảng noti_comment
            $db = new db_query('SELECT noc_id,noc_user_id,
                                        noc_comment_by_user,
                                        noc_article_id,
                                        noc_article_type,
                                        noc_com_id,
                                        noc_time AS sorting,
                                        noc_status 
                                FROM notification_comment 
                                WHERE noc_user_id = '.$this->use_id . $where3);
            $array3 = $db->resultArray();unset($db);
            $array_return = array_merge($array1,$array2,$array3);
            uasort($array_return,'sort_desc_array_value');
        }
        if($limit){
            foreach($array_return as $k=>$v){
                if($k > $limit-1){
                    unset($array_return[$k]);
                }
            }
        }
        return $array_return;
    }
    
    public function CountNotificationUnread(){
        return count($this->ListNotifications(1,0));
    }
}
?>